package com.xm.bean.context;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * 通过 ApplicationContext.getBean() 手动获取 Bean
 *   问题：
 *      在 Bean 初始化过程中直接调用 ApplicationContext.getBean()
 *      可能导致未完全初始化的 Bean 被使用。
 *   解决方案：
 *      避免在初始化阶段手动获取 Bean：将 getBean() 的逻辑移到 Bean 初始化完成后。
 *      使用 @PostConstruct 延迟操作：
 *      结合 @Lazy：确保依赖链的延迟加载。
 */
public class ApplicationContextGetBean03 {
}

@Component
class A5{
    @Autowired
    private ApplicationContext context;
    private B5 b;

    @PostConstruct
    public void init() {
        b = context.getBean(B5.class);
    }
}

@Component
class B5 {
    private final A5 a;
    public B5(@Lazy A5 a) {
        this.a = a;
    }
}